C语言练习之字符串

您所在的位置:网站首页 字符串拼接c 语言 C语言练习之字符串

C语言练习之字符串

2024-02-23 08:10| 来源: 网络整理| 查看: 265

1,有关字符串的函数介绍

 字符串长度获取 strlen(const char *str)`:获取字符串的长度,不包括结束字符'\0'。

字符串复制  `strcpy(char *dest, const char *src)`:将源字符串`src`复制到目标字符串`dest`。  `strncpy(char *dest, const char *src, size_t n)`:复制`src`的前`n`个字符到`dest`。

字符串比较 `strcmp(const char *str1, const char *str2)`:比较两个字符串的大小。 `strncmp(const char *str1, const char *str2, size_t n)`:比较两个字符串的前`n`个字符。

字符串查找 `strchr(const char *str, int c)`:查找字符串`str`中第一次出现字符`c`的位置。 `strrchr(const char *str, int c)`:查找字符串`str`中最后一次出现字符`c`的位置。

字符串分割 `strtok(char *str, const char *delim)`:使用指定的分隔符`delim`对字符串`str`进行分割。

字符串替换 `strreplace(char *str, const char *old, const char *new)`:替换字符串`str`中的`old`为`new`。

 字符串格式化 - `printf(const char *format, ...)`和`fprintf(FILE *stream, const char *format, ...)`:格式化输出字符串。 - `scanf(const char *format, ...)`和`fscanf(FILE *stream, const char *format, ...)`:格式化输入字符串。

字符串转换 `strtol(const char *str, char **endptr, int base)`:将字符串`str`转换为长整型。 `strtoul(const char *str, char **endptr, int base)`:将字符串`str`转换为无符号长整型。 `strtod(const char *str, char **endptr)`:将字符串`str`转换为双精度浮点型。

以上函数都定义在``或``头文件中。在使用这些函数时,需要注意字符串的长度和边界,以防止缓冲区溢出等问题。

2,字符串逆序 2.1题目示例 /* 思路:该题比较简单,请参考代码 */ void Reverse(char* str) { char* left = str; char* right = str + strlen(str)-1; while(left < right) { char temp = *left; *left = *right; *right = temp; ++left; --right; } } int main() { char str[] = "hello bit"; //在这里完成下面函数,参数自己设计,要求:使用指针 Reverse(str); return 0; } // 注意:如果是在线OJ时,必须要考虑循环输入,因为每个算法可能有多组测试用例进行验证,参考以下main函数写法, int main() { char str[101] = {0}; while(gets(str)) { Reverse(str); printf("%s\n", str); memset(str, 0, sizeof(str)/sizeof(str[0])); } return 0; 2.2 reverse()函数的解释

reverse()函数通常用于数据结构(如数组或列表)中的元素进行反转。具体来说,它可以将数组或列表 的前后元素互换,使得第一个元素变成最后一个元素,第二个元素变成倒数第二个元素,以此类推

3,字符串比较

在C语言中,你可以使用`strcmp()`函数来比较两个字符串。这个函数的原型如下:

int strcmp(const char *str1, const char *str2);

其中,`str1`和`str2`是要比较的两个字符串。这个函数会比较两个字符串的每个字符,按照ASCII码值进行比较。如果两个字符串完全相同,则返回0;如果`str1`的ASCII码值大于`str2`的,则返回正值;反之,如果`str1`的ASCII码值小于`str2`的,则返回负值。

以下是一个使用`strcmp()`函数的例子:

#include #include int main() {     char *str1 = "Hello";     char *str2 = "World";     int result = strcmp(str1, str2);     if(result == 0){         printf("The strings are equal.\n");     }else if(result < 0){         printf("str1 is less than str2.\n");     }else{         printf("str1 is greater than str2.\n");     }     return 0; }

在这个例子中,我们首先定义了两个字符串`str1`和`str2`,然后使用`strcmp()`函数比较它们。最后,根据比较结果打印相应的信息。

输出将会是: result1: -1 (或者任何负数)

result2: 0

result3: 1 (或者任何正数)需要注意的是,strcmp函数在比较时不会检查字符串是否以空字符('\0')结尾,因为它假设传入的都是合法的以空字符结尾的C字符串。如果字符串不是以空字符结尾,那么strcmp的行为是未定义的。

4,字符串替换

 在C语言中测试字符串的替换功能,你可以编写一个单元测试或者简单地调用替换函数并打印结果来验证其行为是否符合预期。以下是如何实现这一测试的步骤:

1. 实现一个字符串替换函数(如之前所述)。 2. 编写测试用例,包括正常情况和边界条件。 3. 调用替换函数,并检查返回的字符串是否正确。 4. 验证替换后的字符串长度和内容。

以下是一个测试字符串替换功能的示例:

#include #include #include // 字符串替换函数 void replaceString(char* str, const char* search, const char* replacement) {     char* src = str;     size_t lenSearch = strlen(search);     size_t lenReplacement = strlen(replacement);     char* temp = NULL;     size_t foundCount = 0;     // 计算搜索字符串出现的次数     while ((temp = strstr(src, search)) != NULL) {         ++foundCount;         src = temp + lenSearch;     }     // 如果没有找到要替换的子串,直接返回     if (foundCount == 0) {         return;     }     // 为新的字符串分配足够的空间     char* newStr = (char*)malloc((strlen(str) + (lenReplacement - lenSearch) * foundCount + 1) * sizeof(char));     if (newStr == NULL) {         fprintf(stderr, "Memory allocation failed\n");         exit(EXIT_FAILURE);     }     src = str;     size_t offset = 0;     // 进行替换操作     while ((temp = strstr(src, search)) != NULL) {         memcpy(newStr + offset, src, temp - src);         memcpy(newStr + offset + (temp - src), replacement, lenReplacement);         offset += (temp - src) + lenReplacement;         src = temp + lenSearch;     }     memcpy(newStr + offset, src, strlen(src) + 1);     // 替换完成后,释放原字符串空间并将新字符串赋值给原字符串指针     free(str);     strcpy(str, newStr);     free(newStr); } // 主函数,包含测试用例 int main() {     // 测试用例1: 替换字符串中的单词     char str1[] = "Hello world, this is an example sentence.";     const char* search1 = "example";     const char* replacement1 = "test";          printf("Test Case 1:\n");     printf("Original String: %s\n", str1);     replaceString(str1, search1, replacement1);     printf("Replaced String: %s\n\n", str1);     // 测试用例2: 不存在的搜索词     char str2[] = "Hello world, this is a sentence.";     const char* search2 = "not-found";     const char* replacement2 = "found";          printf("Test Case 2:\n");     printf("Original String: %s\n", str2);     replaceString(str2, search2, replacement2);     printf("Replaced String: %s\n\n", str2);     return 0; }

在这个例子中,我们有两个测试用例。

第一个测试用例检查了一个已存在于原始字符串中的单词是否被正确替换。

第二个测试用例检查了当搜索的子串不存在时,原始字符串是否保持不变。

在每个测试用例中,我们都会打印原始字符串和替换后的字符串,以验证替换功能是否按预期工作。

4.1memcpy()函数的解释

`memcpy()`函数是C/C++编程中常用的内存拷贝函数,它的原型如下:

void *memcpy(void* dest, const void *src, size_t n);

其中,`dest`是指向目标内存空间的指针,`src`是指向源内存空间的指针,`n`是要拷贝的字节数。

`memcpy()`函数会将`src`指向的内存空间中的连续`n`个字节的数据复制到`dest`指向的内存空间中。

需要注意的是,`dest`和`src`所指的内存区域不能重叠,否则可能导致不可预期的结果。另外,`memcpy()`并不像`strcpy()`那样在遇到字符串结束符`\0`时停止复制,它会一直复制`n`个字节。

下面是一个简单的使用例子:

char a, b; memcpy(b, a, sizeof(b));  // 将a数组的内容复制到b数组中

在这个例子中,`sizeof(b)`会计算出`b`数组的大小,然后`memcpy()`会从这个位置开始复制,直到复制完所有字节。

此外,`memcpy()`不仅可以用于数组,也可以用于任何可读写的内存空间。例如,如果你想从一个字符串中复制一部分内容到一个字符数组中,你可以这样做:

char* s = "Hello World"; char d; memcpy(d, s + 12, 4);  // 从s的第12个字符开始复制4个字符

在这个例子中,`s + 12`指向的是字符串`s`的第12个字符,因此`memcpy()`会从这里开始复制4个字符到`d`数组中

5,字符串动态增长 5.1,用realloc()函数实现

 在C语言中,可以使用 `realloc()` 函数来实现字符串的动态大小增长。`realloc()` 函数允许你在运行时重新分配内存,这对于动态增加字符串大小非常有用。

以下是一个简单的示例,展示了如何使用 `realloc()` 来扩展字符串的大小:

#include #include #include int main() {     char* str = malloc(sizeof(char) * 10); // 初始化字符串,长度为10     strcpy(str, "Hello, World!"); // 将字符串复制到新分配的内存中     // 使用realloc()函数扩展字符串大小     str = realloc(str, sizeof(char) * 20); // 现在字符串的长度为20     // 继续向字符串添加


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3